Skip to content

lss 2.0 stage 8: website as a scroll film - #29

Draft
VectoDE wants to merge 4 commits into
feat/lss-6from
feat/lss-8
Draft

VectoDE wants to merge 4 commits into
feat/lss-6from
feat/lss-8

Conversation

@VectoDE

@VectoDE VectoDE commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Stage 8 of the 2.0 rebuild: the website on GitHub Pages, lss explained as a film that plays while scrolling.

  • scripts/build-site.sh builds one static page from the repository: a scene per module group from the module metadata (MOD_NAME, MOD_GROUP, MOD_DESCRIPTION, MOD_CONFLICTS, MOD_OPTIONS, MOD_REQUIRES), the profiles, the guard defaults, lss --help, the menu of lib/ui.sh and data/systems.conf. The page is generated in the Pages workflow and never committed, so modules added later appear with the next deploy.
  • site/: inlined stylesheet (allowed by its SHA-256 in the CSP), film.js (the only script), favicon, robots.txt. System fonts only, no external requests, no tracking.
  • Motion without a library and without requests to other servers: a 2D canvas behind the text where packets drift across the screen and close into a shield with "lss" cut out while the module groups pass; the guard sweeps a scan line over it, then it fades out and stops drawing. It starts after load, sleeps in hidden tabs, caps the device pixel ratio at 1.5 and is drawn at half strength on narrow screens. Heading words rise out of masks (CSS scroll-driven animations, IntersectionObserver fallback that only applies once the script has run), captions come in word by word, the opening steps back and the repository counts run up once.
  • The CSP hash of the stylesheet comes from sha256sum and base64, so the build also runs in the kcov image of the coverage job (no openssl there).
  • Reduced motion, no scripting or a short screen: the same scenes as a still sequence. Chapter list, skip link, visible focus, plain headings, lists and tables.
  • data/systems.conf: one source for the supported systems and the resource figures; the build fails when the README tables differ.
  • .github/workflows/pages.yml: build and Lighthouse (100 in all four categories, three runs, median) on every pull request; upload and deploy only on main, with pages: write and id-token: write for the deploy job alone.
  • docs/website.md: sources, build, CSP and the headers a host should send, deploy.

GitHub Pages has to be enabled once with the source "GitHub Actions" before the first deploy from main.

Refs #10

VectoDE and others added 4 commits October 16, 2026 18:00
The website for issue #10. scripts/build-site.sh writes one static page from the repository itself: a scene per
module group from MOD_NAME, MOD_GROUP, MOD_DESCRIPTION, MOD_CONFLICTS and MOD_OPTIONS, the profiles, the guard
defaults, the help text of lss, the whiptail menu and data/systems.conf. The Pages workflow runs it on every deploy
and the page is never committed, so a module added later (Traefik, say) is on the site without anyone touching it.

Scrolling scrubs each scene: log lines appear like a run of lss, module lists roll past, profiles and menu items
switch one at a time. Every word is in the HTML from the start; with reduced motion, without scripting or on a
short screen the same scenes are a still sequence. No framework, no fonts or requests from elsewhere, a strict
Content Security Policy with the inlined stylesheet allowed by its hash. Lighthouse runs in CI and fails below 100
in any category; deploy runs only on main.

data/systems.conf becomes the one source of the supported systems and the resource figures; the build fails when
the README tables say something else.

Refs #10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: VectoDE <system.bot.discord.utility@gmail.com>
The coverage run of the unit tests uses the kcov image, which has no
openssl, so the build stopped there. The CSP hash now comes from
sha256sum and base64; the unit test still checks it with openssl where
openssl is installed.

Every function of the generator copies its arguments into named locals,
and the ends of the lists go through list_close, as SonarCloud asks.

Refs #10

Signed-off-by: VectoDE <system.bot.discord.utility@gmail.com>
The film gets more motion, all of it drawn by the page itself:

- A 2D canvas behind the text: packets drift across the screen and,
  from the first run to the last module group, leave their lines in
  random order and close into a shield with "lss" cut out. The guard
  sweeps a scan line over it, then the field fades out and stops. It
  starts after load, sleeps in hidden tabs, draws at most at 1.5 times
  the CSS resolution and at half strength on narrow screens, where the
  shield sits behind the text. A seeded generator places the packets.
- The words of every heading rise out of their masks, driven by CSS
  scroll-driven animations; where the browser lacks them, film.js marks
  the page and raises each heading when it comes into view.
- Captions come in word by word, the opening steps back, and the counts
  of modules, groups, profiles and tested systems run up once, each
  number keeping its final width.
- One frame measures every scene before it writes.

Reduced motion, no scripting or a short screen keep the still sequence.

Refs #10

Signed-off-by: VectoDE <system.bot.discord.utility@gmail.com>
The generator wrapped its seed with | 0, which SonarCloud reads as a
truncation. >>> 0 wraps it the same way and gives the same sequence.

Refs #10

Signed-off-by: VectoDE <system.bot.discord.utility@gmail.com>
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant